package com.kotlin.flong.coroutines1

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

/**
 * @Author:liangjl
 * @Date: 2020/7/8-21:52
 * @Eamil:jilongliang@sina.com
 * @Description:
 * 关于父子协程之间的关系
 * 1、当一个协程是通过另外一个协程CoroutineScope来启动的，那么这个协程就会通过coroutineScope.CoroutineContext
 * 来继承基上下文信息，同时，新协程的Job就会成为父协程Job的一个孩子，当父协程被取消执行时，该父协程的所有孩子都会通过
 * 递归的方式一并取消执行
 * 2、特殊情况，当我们使用GlobalScope来启动协程时，对于启动的新协程来说，其Job是没有父Job的，因此，它不会绑定到其他所
 * 启动的哪个范围上，故其k可以独立执行（这是一种特殊情况）
 *
 */

fun main() = runBlocking {

    var request = launch {
        GlobalScope.launch {
            println("job1 hello")
            delay(1000)
            println("job2 world")
        }
        launch {
            delay(1000)
            println("job2 hello")
            delay(1000)
            println("job2 world")
        }
    }

    delay(500)
    request.cancel()
    delay(1000)

    println("welcome")
}
